﻿#define _CRT_SECURE_NO_WARNINGS 1 

/*
颠倒给定的 32 位无符号整数的二进制位。

提示：

请注意，在某些语言（如 Java）中，没有无符号整数类型。在这种情况下，输入和输出都将被指定为有符号整数类型，
并且不应影响您的实现，因为无论整数是有符号的还是无符号的，其内部的二进制表示形式都是相同的。
在 Java 中，编译器使用二进制补码记法来表示有符号整数。因此，在 示例 2 中，输入表示有符号整数 -3，输出表示有符号整数 -1073741825。
 
示例 1：

输入：n = 00000010100101000001111010011100
输出：964176192 (00111001011110000010100101000000)
解释：输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596，
     因此返回 964176192，其二进制表示形式为 00111001011110000010100101000000。
示例 2：

输入：n = 11111111111111111111111111111101
输出：3221225471 (10111111111111111111111111111111)
解释：输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293，
     因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。

*/

// 首先了解一下按位与的特点：两个都为1则为1，一个为0则为0。
// 用&1取出32位的最后一位
// 将它移到第一位
// 也就是移动31次 --> << (31 - 0)
// 当移出最后一位后，将n右移，取出n的倒数第二位
// 通过循环，来讲ret逐步移动，将ret累加到ans中
// 最后返回ans
// 最后当n为0时，循环结束，移动完成
// 因为一旦n为0，说明已经不需要累加了，反正每一位都是0

//时间复杂度：O(N) 空间复杂度：O(1)

uint32_t reverseBits(uint32_t n)
{
    uint32_t ans = 0;
    for (int i = 0; n != 0; i++)
    {
        ans += (n & 1) << (31 - i);
        n >>= 1;
    }
    return ans;
}